//
//  PictureBrowserViewCell.swift
//  XinLangWeibo10
//
//  Created by 白利兵 on 15/11/6.
//  Copyright © 2015年 itheima. All rights reserved.
//

import UIKit
import SDWebImage
import SVProgressHUD
protocol PictureBrowserViewCellDelegate: NSObjectProtocol {
    func PictureBrowserViewCellDidSelected(cell: UICollectionViewCell)
}
class PictureBrowserViewCell: UICollectionViewCell {
    private var picSize: CGSize = CGSize(width: 0, height: 0)
    // 定义一个代理属性
    weak var delegate: PictureBrowserViewCellDelegate?
    // MARK: - 懒加载控件
    // 定义一个scrollView
    lazy var scrollView: UIScrollView = UIScrollView()
    lazy var imageView: UIImageView = UIImageView()
    // 占位图
    private lazy var placeHolder: ProgressImageView = ProgressImageView()
    // url模型
    var url: NSURL? {
        didSet {
            guard let imageUrl = url else {
                return
            }
            // 每次都需要恢复一下图片的原始状态，因为会发生cell的重用
            imageView.transform = CGAffineTransformIdentity
            scrollView.contentSize = CGSizeZero
            scrollView.contentOffset = CGPointZero
            scrollView.contentInset = UIEdgeInsetsZero
            // 设置缩略图
            // 从缓存中取缩略图
         let  image = SDWebImageManager.sharedManager().imageCache.imageFromDiskCacheForKey(imageUrl.absoluteString)
            placeHolder.image = image
            placeHolder.sizeToFit()
            // 设置位置
            placeHolder.center = contentView.center
            // 异步加载大图
            // 2. 异步加载大图 - sd_webImage 有一个功能，一但设置了 url，准备异步加载
            // 清除之前的图片/如果之前的图片也是异步下载，但是没有完成，取消之前的异步操作！
            // 如果 url 对应的图像已经被缓存，直接从磁盘读取，不会再走网络加载
            // 几乎所有的第三方框架，进度回调都是异步的！
            // 原因：
            // 1. 不是所有的程序都需要进度回调
            // 2. 进度回调的频率非常高，如果在主线程，会造成主线程的卡顿
            // 3. 使用进度回调，要求界面上跟进进度变化的 UI 不多，而且不会频繁更新！
            var urlString = imageUrl.absoluteString
            urlString = urlString.stringByReplacingOccurrencesOfString("/thumbnail/", withString: "/bmiddle/")
            let bmiddleUrl = NSURL(string: urlString)
            imageView.sd_setImageWithURL(bmiddleUrl, placeholderImage: nil, options: [SDWebImageOptions.RetryFailed, SDWebImageOptions.RefreshCached], progress: { (progress, total) -> Void in
                // 异步更新UI
                dispatch_async(dispatch_get_main_queue(), { () -> Void in
                    self.placeHolder.progress = CGFloat (progress) / CGFloat (total)
                })
                }) { (image, _, _, _) -> Void in
                   // 判断图像是否下载成功
                    if image == nil {
                        SVProgressHUD.showErrorWithStatus("您的网络不给力")
                        return
                    }
                    // 隐藏占位图
                    self.placeHolder.hidden = true
                    // 设置图片位置
                    self.setPostion(image)
            }
        }
        
    }
    // 构造函数
    override init(frame: CGRect) {
        super.init(frame: frame)
        setupUI()
        
    }
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    // 设置图片位置
    private func setPostion(image: UIImage) {
        let size = setDisplayImageSize(image)
        // 记录原始SIZE
        picSize = size
        // 判断高度大小
        if size.height < scrollView.bounds.height {
            imageView.frame = CGRect(x: 10, y: 0, width: size.width-20, height: size.height)
            let offset = (scrollView.bounds.height - size.height)*0.5
            print("offset--\(offset)")
            scrollView.contentInset = UIEdgeInsets(top: offset, left: 0, bottom: 0, right: 0)
        }
        else {
            imageView.frame = CGRect(x: 10, y: 0, width: size.width-20, height: size.height)
            scrollView.contentSize = size
        }
    }
    /// 根据 scrollView 的宽度计算等比例缩放之后的图片尺寸
    ///
    /// - parameter image: image
    ///
    /// - returns: 缩放之后的 size
    private func setDisplayImageSize(image: UIImage) -> CGSize {
        let width = scrollView.bounds.width
        let height = image.size.height * (scrollView.bounds.width/image.size.width)
        return CGSize(width: width, height: height)
    }
}
// 设置UI
extension PictureBrowserViewCell {
    private func setupUI() {
        
        // 添加控件
        contentView.addSubview(scrollView)
        scrollView.addSubview(imageView)
        scrollView.addSubview(placeHolder)
        // 为imageView添加手势事件
        let tap = UITapGestureRecognizer(target: self, action: "ImageTap")
        imageView.addGestureRecognizer(tap)
        // 开启图片的用户交互属性
        imageView.userInteractionEnabled = true
        //设置scrollView缩放范围
        scrollView.minimumZoomScale = 0.5
        scrollView.maximumZoomScale = 2.0
        scrollView.delegate = self
        scrollView.frame = contentView.bounds
    }
    // 轻敲时关闭图片
    @objc private func ImageTap() {
        // 代理实现关闭控制器方法
        delegate?.PictureBrowserViewCellDidSelected(self)
    }
}
// MARK: - UIScrollViewDelegate
extension PictureBrowserViewCell: UIScrollViewDelegate{
    @objc func viewForZoomingInScrollView(scrollView: UIScrollView) -> UIView?{
        return imageView
    }
    @objc func scrollViewDidEndZooming(scrollView: UIScrollView, withView view: UIView?, atScale scale: CGFloat){
        //print("frame = \(scrollView.frame)")
        //print("contentSize = \(scrollView.contentSize)")
        // 缩小完毕后，恢复到原来的位置和大小
        if scale < 1.0 {
            view?.frame.size = picSize
            print(picSize)
            view?.frame.origin = CGPoint(x: 0, y: 0)
        }
    }
    
}






